package controllers.vecino;

import java.util.Collection;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import services.ActaService;
import services.ComunidadDeVecinosService;
import services.ReunionService;
import services.VecinoService;
import controllers.AbstractController;
import domain.Acta;
import domain.Reunion;
import domain.Vecino;

@Controller
@RequestMapping("/acta/vecino")
public class ActaVecinoController extends AbstractController {

	@Autowired
	private ActaService actaService;
	@Autowired
	private VecinoService vecinoService;

	@Autowired
	private ReunionService reunionService;

	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView list(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Acta> actas;

		actas = actaService.findActasByComunidadDeVecinos(comunidadId);

		result = new ModelAndView("acta/list");
		result.addObject("requestURI", "acta/vecino/list.do");
		result.addObject("actas", actas);
		result.addObject("backURI", "/comunidad/vecino/edit.do?comunidadId="
				+ comunidadId);

		return result;
	}

	@RequestMapping(value = "/create", method = RequestMethod.GET)
	public ModelAndView create(@RequestParam int reunionId) {
		ModelAndView result;
		Acta acta;
		Boolean isActaMoroso;
		Boolean editable;
		Reunion reunion;

		isActaMoroso = false;
		reunion = reunionService.findOne(reunionId);

		editable = comunidadDeVecinosService.isPresidente(reunion
				.getComunidadDeVecinos().getId());

		acta = actaService.create(reunionId);

		result = new ModelAndView("acta/create");
		result.addObject("requestURI", "acta/vecino/create.do");
		result.addObject("acta", acta);
		result.addObject("editable", editable);
		result.addObject("isActaMoroso", isActaMoroso);
		result.addObject("backURI", "reunion/vecino/edit.do?reunionId="
				+ reunionId);

		return result;
	}

	@RequestMapping(value = "/morososList", method = RequestMethod.GET)
	public ModelAndView morosoList(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Acta> actas;

		actas = actaService.findActasMorosoByComunidadDeVecinos(comunidadId);

		result = new ModelAndView("acta/morosoList");
		result.addObject("requestURI", "acta/morososList.do");
		result.addObject("backURI", "/comunidad/vecino/edit.do?comunidadId="
				+ comunidadId);
		result.addObject("actas", actas);

		return result;
	}

	@RequestMapping(value = "/createActaMoroso", method = RequestMethod.GET)
	public ModelAndView createActaMoroso(@RequestParam int reunionId) {
		ModelAndView result;
		Acta acta;
		Boolean isActaMoroso;
		Boolean editable;
		Reunion reunion;
		Collection<Vecino> morosos;

		reunion = reunionService.findOne(reunionId);
		morosos = vecinoService.findByMorososByComunidad(reunion
				.getComunidadDeVecinos().getId());

		editable = comunidadDeVecinosService.isPresidente(reunion
				.getComunidadDeVecinos().getId());
		isActaMoroso = true;
		acta = actaService.create(reunionId);
		acta.setTipo("Moroso");

		result = new ModelAndView("acta/createActaMoroso");
		result.addObject("requestURI", "acta/vecino/create.do");
		result.addObject("acta", acta);
		result.addObject("morosos", morosos);
		result.addObject("isActaMoroso", isActaMoroso);
		result.addObject("editable", editable);
		result.addObject("backURI", "reunion/vecino/edit.do?reunionId="
				+ reunionId);

		return result;
	}

	@RequestMapping(value = "/create", method = RequestMethod.POST, params = "save")
	public ModelAndView save(@Valid Acta acta, BindingResult binding) {
		ModelAndView result;

		if (binding.hasErrors()) {
			result = createEditModelAndView(acta);
		} else {
			try {
				if (acta.getTipo().equals("Ordinaria")
						|| acta.getTipo().equals("Extraordinaria")) {

					Reunion reunion = acta.getReunion();

					if (reunion.getImporte() == null
							|| reunion.getImporte() <= 0.0) {

						result = createEditModelAndView(acta,
								"acta.importe.error");
					} else {
						actaService.save(acta);
						result = new ModelAndView(
								"redirect:/acta/vecino/list.do?comunidadId="
										+ acta.getComunidadDeVecinos().getId());
					}
				} else {
					actaService.save(acta);
					result = new ModelAndView(
							"redirect:/acta/vecino/list.do?comunidadId="
									+ acta.getComunidadDeVecinos().getId());
				}
			} catch (Throwable oops) {

				result = createEditModelAndView(acta, "acta.commit.error");
			}
		}

		return result;
	}

	// Ancillary methods
	protected ModelAndView createEditModelAndView(Acta acta) {
		ModelAndView result;

		result = createEditModelAndView(acta, null);

		return result;
	}

	protected ModelAndView createEditModelAndView(Acta acta, String message) {
		ModelAndView result;
		Reunion reunion;
		reunion = reunionService.findOne(acta.getReunion().getId());

		if (acta.getTipo().equals("Moroso")) {
			Boolean isActaMoroso;
			Boolean editable;
			Collection<Vecino> morosos;

			morosos = vecinoService.findByMorososByComunidad(reunion
					.getComunidadDeVecinos().getId());

			editable = comunidadDeVecinosService.isPresidente(reunion
					.getComunidadDeVecinos().getId());
			isActaMoroso = true;

			result = new ModelAndView("acta/createActaMoroso");
			result.addObject("requestURI", "acta/vecino/create.do");
			result.addObject("acta", acta);
			result.addObject("morosos", morosos);
			result.addObject("isActaMoroso", isActaMoroso);
			result.addObject("editable", editable);

		} else {
			Boolean isActaMoroso;
			Boolean editable;

			isActaMoroso = false;

			editable = comunidadDeVecinosService.isPresidente(reunion
					.getComunidadDeVecinos().getId());

			result = new ModelAndView("acta/create");
			result.addObject("requestURI", "acta/vecino/create.do");
			result.addObject("editable", editable);
			result.addObject("isActaMoroso", isActaMoroso);

		}
		result.addObject("backURI", "reunion/vecino/edit.do?reunionId="
				+ reunion.getId());
		result.addObject("acta", acta);
		result.addObject("message", message);

		return result;
	}
}